mruby 4.0.0
mruby is the lightweight implementation of the Ruby language
Loading...
Searching...
No Matches
value.h
Go to the documentation of this file.
1
6
7#ifndef MRUBY_VALUE_H
8#define MRUBY_VALUE_H
9
10#include "common.h"
11
12/*
13 * mruby Value definition functions and macros.
14 */
16
23typedef uint32_t mrb_sym;
24
34#if defined(__cplusplus) || (defined(__bool_true_false_are_defined) && __bool_true_false_are_defined)
35typedef bool mrb_bool;
36
37# ifndef FALSE
38# define FALSE false
39# endif
40# ifndef TRUE
41# define TRUE true
42# endif
43#else
44# if __STDC_VERSION__ >= 199901L
45typedef _Bool mrb_bool;
46# else
47typedef uint8_t mrb_bool;
48# endif
49
50# ifndef FALSE
51# define FALSE 0
52# endif
53# ifndef TRUE
54# define TRUE 1
55# endif
56#endif
57
58#if defined _MSC_VER && _MSC_VER < 1800
59# define PRIo64 "llo"
60# define PRId64 "lld"
61# define PRIu64 "llu"
62# define PRIx64 "llx"
63# define PRIo16 "ho"
64# define PRId16 "hd"
65# define PRIu16 "hu"
66# define PRIx16 "hx"
67# define PRIo32 "o"
68# define PRId32 "d"
69# define PRIu32 "u"
70# define PRIx32 "x"
71#else
72# include <inttypes.h>
73#endif
74
75#if defined(MRB_INT64)
76 typedef int64_t mrb_int;
77 typedef uint64_t mrb_uint;
78# define MRB_INT_BIT 64
79# define MRB_INT_MIN INT64_MIN
80# define MRB_INT_MAX INT64_MAX
81# define MRB_PRIo PRIo64
82# define MRB_PRId PRId64
83# define MRB_PRIx PRIx64
84#else
85 typedef int32_t mrb_int;
86 typedef uint32_t mrb_uint;
87# define MRB_INT_BIT 32
88# define MRB_INT_MIN INT32_MIN
89# define MRB_INT_MAX INT32_MAX
90# define MRB_PRIo PRIo32
91# define MRB_PRId PRId32
92# define MRB_PRIx PRIx32
93#endif
94
95#define MRB_FLAGS_MASK(shift, width) (~(~0U << (width)) << (shift))
96#define MRB_FLAGS_GET(b, s, w) (((b) >> (s)) & MRB_FLAGS_MASK(0, w))
97#define MRB_FLAGS_SET(b, s, w, n) ((b) = MRB_FLAGS_ZERO(b, s, w) | MRB_FLAGS_MAKE(s, w, n))
98#define MRB_FLAGS_ZERO(b, s, w) ((b) & ~MRB_FLAGS_MASK(s, w))
99#define MRB_FLAGS_MAKE(s, w, n) (((n) & MRB_FLAGS_MASK(0, w)) << (s))
100#define MRB_FLAG_ON(b, s) ((b) |= MRB_FLAGS_MASK(s, 1))
101#define MRB_FLAG_OFF(b, s) ((b) &= ~MRB_FLAGS_MASK(s, 1))
102#define MRB_FLAG_CHECK(b, s) (!!((b) & MRB_FLAGS_MASK(s, 1)))
103
104MRB_API mrb_bool mrb_read_int(const char *p, const char *e, char **endp, mrb_int *np);
105/* obsolete; do not use mrb_int_read() */
106MRB_API mrb_int mrb_int_read(const char*, const char*, char**);
107#ifndef MRB_NO_FLOAT
108MRB_API mrb_bool mrb_read_float(const char *p, char **endp, double *fp);
109/* obsolete; do not use mrb_float_read() */
110MRB_API double mrb_float_read(const char *p, char **endp);
111#ifdef MRB_USE_FLOAT32
112 typedef float mrb_float;
113#else
114 typedef double mrb_float;
115#endif
116#endif
117
118#if defined _MSC_VER && _MSC_VER < 1900
119MRB_API int mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg);
120MRB_API int mrb_msvc_snprintf(char *s, size_t n, const char *format, ...);
121# define vsnprintf(s, n, format, arg) mrb_msvc_vsnprintf(s, n, format, arg)
122# define snprintf(s, n, format, ...) mrb_msvc_snprintf(s, n, format, __VA_ARGS__)
123# if _MSC_VER < 1800 && !defined MRB_NO_FLOAT
124# define isfinite(n) _finite(n)
125# define isnan _isnan
126# define isinf(n) (!_finite(n) && !_isnan(n))
127# define signbit(n) (_copysign(1.0, (n)) < 0.0)
128static const unsigned int IEEE754_INFINITY_BITS_SINGLE = 0x7F800000;
129# define INFINITY (*(float*)&IEEE754_INFINITY_BITS_SINGLE)
130# define NAN ((float)(INFINITY - INFINITY))
131# endif
132#endif
133
134#define MRB_VTYPE_FOREACH(f) \
135 /* mrb_vtype */ /* C type */ /* Ruby class */ \
136 f(MRB_TT_FALSE, void, "false") \
137 f(MRB_TT_TRUE, void, "true") \
138 f(MRB_TT_SYMBOL, void, "Symbol") \
139 f(MRB_TT_UNDEF, void, "undefined") \
140 f(MRB_TT_FREE, void, "free") \
141 f(MRB_TT_FLOAT, struct RFloat, "Float") \
142 f(MRB_TT_INTEGER, struct RInteger, "Integer") \
143 f(MRB_TT_CPTR, struct RCptr, "cptr") \
144 f(MRB_TT_OBJECT, struct RObject, "Object") \
145 f(MRB_TT_CLASS, struct RClass, "Class") \
146 f(MRB_TT_MODULE, struct RClass, "Module") \
147 f(MRB_TT_SCLASS, struct RClass, "SClass") \
148 f(MRB_TT_HASH, struct RHash, "Hash") \
149 f(MRB_TT_CDATA, struct RData, "C data") \
150 f(MRB_TT_EXCEPTION, struct RException, "Exception") \
151 f(MRB_TT_ICLASS, struct RClass, "iClass") \
152 f(MRB_TT_PROC, struct RProc, "Proc") \
153 f(MRB_TT_ARRAY, struct RArray, "Array") \
154 f(MRB_TT_STRING, struct RString, "String") \
155 f(MRB_TT_RANGE, struct RRange, "Range") \
156 f(MRB_TT_ENV, struct REnv, "env") \
157 f(MRB_TT_FIBER, struct RFiber, "Fiber") \
158 f(MRB_TT_STRUCT, struct RArray, "Struct") \
159 f(MRB_TT_ISTRUCT, struct RIStruct, "istruct") \
160 f(MRB_TT_BREAK, struct RBreak, "break") \
161 f(MRB_TT_COMPLEX, struct RComplex, "Complex") \
162 f(MRB_TT_RATIONAL, struct RRational, "Rational") \
163 f(MRB_TT_BIGINT, struct RBigint, "Integer") \
164 f(MRB_TT_BACKTRACE, struct RBacktrace, "backtrace") \
165 f(MRB_TT_SET, struct RSet, "Set")
166
167enum mrb_vtype {
168#define MRB_VTYPE_DEFINE(tt, type, name) tt,
169 MRB_VTYPE_FOREACH(MRB_VTYPE_DEFINE)
170#undef MRB_VTYPE_DEFINE
171 MRB_TT_MAXDEFINE
172};
173
174/* obsolete name for MRB_TT_CDATA */
175#define MRB_TT_DATA MRB_TT_CDATA
176
177#define MRB_VTYPE_TYPEOF(tt) MRB_TYPEOF_##tt
178
179#define MRB_VTYPE_TYPEDEF(tt, type, name) typedef type MRB_VTYPE_TYPEOF(tt);
180MRB_VTYPE_FOREACH(MRB_VTYPE_TYPEDEF)
181#undef MRB_VTYPE_TYPEDEF
182
183/* for compatibility */
184#define MRB_TT_FIXNUM MRB_TT_INTEGER
185
186#include <mruby/object.h>
187
188#ifdef MRB_DOCUMENTATION_BLOCK
189
200typedef void mrb_value;
201
202#endif
203
204#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT))
205struct RCptr {
206 MRB_OBJECT_HEADER;
207 void *p;
208};
209#endif
210
211#if defined(MRB_NAN_BOXING)
212#include "boxing_nan.h"
213#elif defined(MRB_WORD_BOXING)
214#include "boxing_word.h"
215#else
216#include "boxing_no.h"
217#endif
218
219#if INTPTR_MAX < MRB_INT_MAX
220 typedef intptr_t mrb_ssize;
221# define MRB_SSIZE_MAX INTPTR_MAX
222#else
223 typedef mrb_int mrb_ssize;
224# define MRB_SSIZE_MAX MRB_INT_MAX
225#endif
226
227#ifndef mrb_immediate_p
228#define mrb_immediate_p(o) (mrb_type(o) <= MRB_TT_CPTR)
229#endif
230#ifndef mrb_integer_p
231#define mrb_integer_p(o) (mrb_type(o) == MRB_TT_INTEGER)
232#endif
233#ifndef mrb_fixnum_p
234#define mrb_fixnum_p(o) mrb_integer_p(o)
235#endif
236#ifndef mrb_symbol_p
237#define mrb_symbol_p(o) (mrb_type(o) == MRB_TT_SYMBOL)
238#endif
239#ifndef mrb_undef_p
240#define mrb_undef_p(o) (mrb_type(o) == MRB_TT_UNDEF)
241#endif
242#ifndef mrb_nil_p
243#define mrb_nil_p(o) (mrb_type(o) == MRB_TT_FALSE && !mrb_fixnum(o))
244#endif
245#ifndef mrb_false_p
246#define mrb_false_p(o) (mrb_type(o) == MRB_TT_FALSE && !!mrb_fixnum(o))
247#endif
248#ifndef mrb_true_p
249#define mrb_true_p(o) (mrb_type(o) == MRB_TT_TRUE)
250#endif
251#ifndef mrb_float_p
252#ifndef MRB_NO_FLOAT
253#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
254#else
255#define mrb_float_p(o) FALSE
256#endif
257#endif
258#ifndef mrb_array_p
259#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
260#endif
261#ifndef mrb_string_p
262#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
263#endif
264#ifndef mrb_hash_p
265#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
266#endif
267#ifndef mrb_cptr_p
268#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
269#endif
270#ifndef mrb_exception_p
271#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
272#endif
273#ifndef mrb_free_p
274#define mrb_free_p(o) (mrb_type(o) == MRB_TT_FREE)
275#endif
276#ifndef mrb_object_p
277#define mrb_object_p(o) (mrb_type(o) == MRB_TT_OBJECT)
278#endif
279#ifndef mrb_class_p
280#define mrb_class_p(o) (mrb_type(o) == MRB_TT_CLASS)
281#endif
282#ifndef mrb_module_p
283#define mrb_module_p(o) (mrb_type(o) == MRB_TT_MODULE)
284#endif
285#ifndef mrb_iclass_p
286#define mrb_iclass_p(o) (mrb_type(o) == MRB_TT_ICLASS)
287#endif
288#ifndef mrb_sclass_p
289#define mrb_sclass_p(o) (mrb_type(o) == MRB_TT_SCLASS)
290#endif
291#ifndef mrb_proc_p
292#define mrb_proc_p(o) (mrb_type(o) == MRB_TT_PROC)
293#endif
294#ifndef mrb_range_p
295#define mrb_range_p(o) (mrb_type(o) == MRB_TT_RANGE)
296#endif
297#ifndef mrb_env_p
298#define mrb_env_p(o) (mrb_type(o) == MRB_TT_ENV)
299#endif
300#ifndef mrb_data_p
301#define mrb_data_p(o) (mrb_type(o) == MRB_TT_CDATA)
302#endif
303#ifndef mrb_fiber_p
304#define mrb_fiber_p(o) (mrb_type(o) == MRB_TT_FIBER)
305#endif
306#ifndef mrb_istruct_p
307#define mrb_istruct_p(o) (mrb_type(o) == MRB_TT_ISTRUCT)
308#endif
309#ifndef mrb_break_p
310#define mrb_break_p(o) (mrb_type(o) == MRB_TT_BREAK)
311#endif
312#ifndef mrb_bool
313#define mrb_bool(o) (mrb_type(o) != MRB_TT_FALSE)
314#endif
315#define mrb_test(o) mrb_bool(o)
316#ifndef mrb_bigint_p
317#ifdef MRB_USE_BIGINT
318#define mrb_bigint_p(o) (mrb_type(o) == MRB_TT_BIGINT)
319#else
320#define mrb_bigint_p(o) FALSE
321#endif
322#endif
323
329#ifndef MRB_NO_FLOAT
331mrb_float_value(mrb_state *mrb, mrb_float f)
332{
333 mrb_value v;
334 (void) mrb;
335 SET_FLOAT_VALUE(mrb, v, f);
336 return v;
337}
338#endif
339
341mrb_cptr_value(mrb_state *mrb, void *p)
342{
343 mrb_value v;
344 (void) mrb;
345 SET_CPTR_VALUE(mrb,v,p);
346 return v;
347}
348
353mrb_int_value(mrb_state *mrb, mrb_int i)
354{
355 mrb_value v;
356 SET_INT_VALUE(mrb, v, i);
357 return v;
358}
359
361mrb_fixnum_value(mrb_int i)
362{
363 mrb_value v;
364 SET_FIXNUM_VALUE(v, i);
365 return v;
366}
367
369mrb_symbol_value(mrb_sym i)
370{
371 mrb_value v;
372 SET_SYM_VALUE(v, i);
373 return v;
374}
375
377mrb_obj_value(void *p)
378{
379 mrb_value v;
380 SET_OBJ_VALUE(v, (struct RBasic*)p);
381 return v;
382}
383
392{
393 mrb_value v;
394 SET_NIL_VALUE(v);
395 return v;
396}
397
403{
404 mrb_value v;
405 SET_FALSE_VALUE(v);
406 return v;
407}
408
414{
415 mrb_value v;
416 SET_TRUE_VALUE(v);
417 return v;
418}
419
421mrb_bool_value(mrb_bool boolean)
422{
423 mrb_value v;
424 SET_BOOL_VALUE(v, boolean);
425 return v;
426}
427
429mrb_undef_value(void)
430{
431 mrb_value v;
432 SET_UNDEF_VALUE(v);
433 return v;
434}
435
436#if defined(MRB_USE_CUSTOM_RO_DATA_P)
437/* If you define `MRB_USE_CUSTOM_RO_DATA_P`, you must implement `mrb_ro_data_p()`. */
438mrb_bool mrb_ro_data_p(const char *p);
439#elif !defined(MRB_NO_DEFAULT_RO_DATA_P)
440#if defined(MRB_USE_ETEXT_RO_DATA_P)
441#define MRB_LINK_TIME_RO_DATA_P
442extern char etext, edata;
443static inline mrb_bool
444mrb_ro_data_p(const char *p)
445{
446 return &etext < p && p < &edata;
447}
448#elif defined(__APPLE__)
449#define MRB_LINK_TIME_RO_DATA_P
450#include <mach-o/getsect.h>
451#include <crt_externs.h> // for _NSGetMachExecuteHeader
452static inline mrb_bool
453mrb_ro_data_p(const char *p)
454{
455#ifdef __LP64__
456 struct mach_header_64 *mhp;
457#else
458 struct mach_header *mhp;
459#endif
460 mhp = _NSGetMachExecuteHeader();
461 unsigned long textsize;
462 char *text = (char*)getsegmentdata(mhp, SEG_TEXT, &textsize);
463 return text <= p && p < text + textsize;
464}
465#endif /* Linux or macOS */
466#endif /* MRB_NO_DEFAULT_RO_DATA_P */
467#ifndef MRB_LINK_TIME_RO_DATA_P
468# define mrb_ro_data_p(p) FALSE
469#endif
470
472
473#endif /* MRUBY_VALUE_H */
nan boxing mrb_value definition
unboxed mrb_value definition
word boxing mrb_value definition
mruby Symbol.
mruby common platform definition"
#define MRB_INLINE
Declare a function as always inlined.
Definition common.h:97
#define MRB_END_DECL
End declarations in C mode.
Definition common.h:28
#define MRB_BEGIN_DECL
Start declarations in C mode.
Definition common.h:26
#define MRB_API
Declare a public mruby API function.
Definition common.h:108
mruby object definition
Definition object.h:19
Definition mruby.h:280
Definition boxing_nan.h:40
static mrb_value mrb_int_value(mrb_state *mrb, mrb_int i)
Returns an integer in Ruby.
Definition value.h:353
static mrb_value mrb_true_value(void)
Returns true in Ruby.
Definition value.h:413
static mrb_value mrb_false_value(void)
Returns false in Ruby.
Definition value.h:402
static mrb_value mrb_nil_value(void)
Get a nil mrb_value object.
Definition value.h:391
static mrb_value mrb_float_value(mrb_state *mrb, mrb_float f)
Returns a float in Ruby.
Definition value.h:331